home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Mail / MailEnclosure / Source.v0.15 / TokenString.m < prev    next >
Text File  |  1995-06-12  |  2KB  |  102 lines

  1. /*
  2. ** TokenString.m,v 1.2 1992/05/21 22:47:36 nwc Exp
  3. **
  4. ** Copyright (c) 1991 Ronin Consulting, Inc.
  5. */
  6.  
  7. #import "TokenString.h"
  8. #import <string.h>
  9.  
  10. @implementation TokenString
  11.  
  12. - init: (const char *) string
  13. {
  14.    [super init: string];
  15.    separator = ' ';
  16.    lastEnd = (char)0;
  17.    nullTokens = NO;
  18.    return self;
  19. }
  20.  
  21. - setStringValue: (const char *) string
  22. {
  23.    [super setStringValue: string];
  24.    start = (char *)[self elementAt: 0];
  25.    return self;
  26. }
  27.  
  28. - setSeparator: (char) aChar
  29. {
  30.    separator = aChar;
  31.    return self;
  32. }
  33.  
  34. - (char) separator
  35. {
  36.    return separator;
  37. }
  38.  
  39. - setNullTokens: (BOOL) toggle
  40. {
  41.    nullTokens = toggle;
  42.    return self;
  43. }
  44.  
  45. - (BOOL) nullTokens
  46. {
  47.    return nullTokens;
  48. }
  49.  
  50.  
  51. - (const char *) popStringValue
  52. {
  53.    char *ptr = start;
  54.  
  55.    while(*start && *start != separator)         /* advance to null or separator*/
  56.        start++;
  57.  
  58.    if(start == ptr)                 /* start did not advance - at the end of a 0 length token */
  59.    {
  60.       if(*start)                 /* zero length due to a separator */
  61.       {
  62.      if(!nullTokens)             /* if nullTokens don't fly here skip consecutive separators */
  63.      {
  64.         while(*start == separator)
  65.         start++;
  66.      
  67.         return([self popStringValue]);             /* passed the separators try again */
  68.      }
  69.       }
  70.       else                     /* zero length due to a null */
  71.       {
  72.      if(!(nullTokens && lastEnd))         /* we don't take null tokens or last time though we hit a null */
  73.          return (const char *)0;
  74.  
  75.      lastEnd = *start;
  76.      return "";                 /* return a null token */
  77.       }
  78.    }
  79.    
  80.    
  81.    /* 
  82.     * Token had length.
  83.     */
  84.  
  85.    lastEnd = *start;
  86.  
  87.    if(*start)                     /* separator */
  88.    {
  89.       *start = (char)0;
  90.  
  91.       if(!nullTokens)                 /* if no null tokens get rid of the multiple separators */
  92.       while(start[1] == separator)
  93.           start++;
  94.  
  95.       start++;                     /* step past separator */
  96.    }
  97.    
  98.    return (const char *)ptr;
  99. }      
  100.  
  101. @end
  102.